import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js';
import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';
// import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js';
const fbxLoader = new FBXLoader();
const objLoader = new OBJLoader();

/**
 * @type {Record<string, {loader:FBXLoader | OBJLoader, readAsFunction: 'readAsArrayBuffer' | 'readAsText'}>}
 */
const loaderStrage = {
  '.fbx': {
    loader: fbxLoader,
    readAsFunction: 'readAsArrayBuffer',
  },
  '.obj': {
    loader: objLoader,
    readAsFunction: 'readAsText',
  },
};

/**
 * @returns {Promise<import('three').Object3D}
 */
export function loadFbxByUrl(url, scale = 0.005) {
  return new Promise((resolve, reject) => {
    fbxLoader.load(
      url,
      (object3d) => {
        object3d.scale.set(scale, scale, scale);
        console.log('Fbx模型加载', object3d);
        resolve(object3d);
      },
      undefined,
      (error) => {
        reject(error);
      }
    );
  });
}

export function loadObj(url) {
  return new Promise((resolve, reject) => {
    objLoader.load(
      url,
      (object3d) => {
        const scale = 0.8;
        object3d.scale.set(scale, scale, scale);
        console.log('Obj模型加载', object3d);
        resolve(object3d);
      },
      undefined,
      (error) => {
        reject(error);
      }
    );
  });
}

/**
 *
 * @param {*} url
 * @param {*} scale
 * @returns {Promise<import('three').Object3D}
 */
export function loadByUrl(url, scale = 1) {
  const urlExtension = url.slice(url.lastIndexOf('.'));
  const { loader } = loaderStrage[urlExtension];
  return new Promise((resolve, reject) => {
    loader.load(
      url,
      (object3d) => {
        object3d.scale.set(scale, scale, scale);
        console.log('[url]模型加载', object3d);
        resolve(object3d);
      },
      undefined,
      (error) => {
        reject(error);
      }
    );
  });
}
/**
 * @param {File} file
 * @returns {Promise<THREE.Object3D>}
 */
export function loadByFile(file, scale = 0.005) {
  return new Promise((resolve, reject) => {
    if (file) {
      const fileExtension = file.name.slice(file.name.lastIndexOf('.'));
      const { loader, readAsFunction } = loaderStrage[fileExtension];
      const reader = new FileReader();
      reader.onload = function (e) {
        const readResults = e.target.result;
        const object3d = loader.parse(readResults,);
        object3d.scale.set(scale, scale, scale);
        console.log('[file]模型加载', object3d);
        resolve(object3d);
      };
      reader.onerror = function (e) {
        reject(e);
      };
      reader[readAsFunction](file);
    }
  });
}
// export default class TestModel {
//   /**
//    * @type {FBXLoader | null}
//    */
//   loader = null;

//   /**
//    * @type {import('three').Object3D | null}
//    */
//   object3d = null;

//   constructor(option) {
//     this.option = option;
//   }

//   // loadFbx() {
//   //   const { fbxUrl, scene } = this.option;
//   //   const loader = new FBXLoader();
//   //   return new Promise((resolve, reject) => {
//   //     loader.load(
//   //       fbxUrl,
//   //       (object3d) => {
//   //         this.object3d = object3d;
//   //         const scale = 0.005;
//   //         object3d.scale.set(scale, scale, scale);
//   //         resolve(object3d);
//   //         console.log('Fbx模型加载');
//   //       },
//   //       undefined,
//   //       (error) => {
//   //         reject(error);
//   //       }
//   //     );
//   //   });
//   // }
//   /**
//    *
//    * @returns {Promise<THREE.Object3D>}
//    */
//   loadObj() {
//     const { objUrl } = this.option;
//     const objLoader = new OBJLoader();
//     return new Promise((resolve, reject) => {
//       objLoader.load(
//         objUrl,
//         (object3d) => {
//           this.object3d = object3d;
//           const scale = 0.8;
//           object3d.scale.set(scale, scale, scale);
//           console.log('Obj模型加载', object3d);
//           resolve(object3d);
//         },
//         undefined,
//         (error) => {
//           reject(error);
//         }
//       );
//     });
//   }
//   loadMtl() {
//     const { mtlUrl, objUrl, scene } = this.option;
//     const mtlLoader = new MTLLoader();
//     const objLoader = new OBJLoader();
//     return new Promise((resolve, reject) => {
//       mtlLoader.load(mtlUrl, (mtl) => {
//         mtl.preload();
//         objLoader.setMaterials(mtl);
//         objLoader.load(
//           objUrl,
//           (object3d) => {
//             this.object3d = object3d;
//             const scale = 0.005;
//             object3d.scale.set(scale, scale, scale);
//             console.log('Mtl模型加载');
//             resolve(object3d);
//           },
//           undefined,
//           (error) => {
//             reject(error);
//           }
//         );
//       });
//     });
//   }

//   rotate() {
//     if (!this.object3d) return;
//     this.object3d.rotateZ(0.05);
//   }
// }
